/**
  ***********************************************************************************************************
  * @file           : bsp_uart.cpp
  * @brief          : 串口bsp的源文件
  ***********************************************************************************************************
  * @note
	* 串口类的实例均在此创建,并且记得将其加入映射表map_list中,以便在中断回调中能够查找到串口类的实例
  ***********************************************************************************************************
  */

#include "bsp_uart.h"

static Uart* map_list[8] = {NULL};  //映射表,方便在中断中查找串口类实例

/*	串口类定义 start*/
Uart uart6(&huart6,24);

/*	串口类定义 end*/

/**
 * @brief 初始化uart外设
 */
extern "C" void bsp_uart_init()
{
    uart6.rx_mode_config(Uart::uart_e::DMA_IT_HEADED,24,0x55,0x00);
    map_list[0] = &uart6;
}

extern "C" void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    /*      使用串口类所管理的串口   start  */
    do{
        //从映射表中查找当前触发中断的串口外设对应的串口类,并调用其数据处理函数
        for (uint8_t i = 0; i < 8; ++i) {
            if (map_list[i]->handle != NULL && map_list[i]->handle == huart) {
                (*map_list[i]).rx_process(map_list[i]->buf_size);   //这里直接传缓冲区大小
                break;
            }
        }
    }while(0);
    /*      使用串口类所管理的串口   end  */

    /*      不使用串口类所管理的串口   start  */

    /*      不使用串口类所管理的串口   end  */
}

extern "C" void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    /*      使用串口类所管理的串口   start  */
    do{
        //从映射表中查找当前触发中断的串口外设对应的串口类,并调用其数据处理函数
        for (uint8_t i = 0; i < 8; ++i) {
            if (map_list[i]->handle != NULL && map_list[i]->handle == huart) {
                (*map_list[i]).rx_process(Size);    //这里传实际接收数据的长度
                break;
            }
        }
    }while(0);
    /*      使用串口类所管理的串口   end  */

    /*      不使用串口类所管理的串口   start  */

    /*      不使用串口类所管理的串口   end  */
}



